home *** CD-ROM | disk | FTP | other *** search
/ IRIX 6.2 / IRIX 6.2 CD2.iso / dist / outbox.idb / var / www / cgi-bin / wrap.z / wrap
Text File  |  1996-06-10  |  12KB  |  661 lines

  1. #!/usr/bin/perl
  2.  
  3. #__________________________________________________________
  4. #
  5. #    File:    wrap
  6. #    By:      Matt Ho
  7. #   Date:    7/23/95
  8. #   Purpose: Wrapper to dynamically create HTML documents
  9. #            that contain a easy to read directory content.
  10. #__________________________________________________________
  11.  
  12.  
  13. #__________________________________________________________
  14. #
  15. #    Set some environment variables, we'll need through the
  16. #    script and do some initial error checking.
  17. #__________________________________________________________
  18.  
  19. $ROOT     = "/var/www/htdocs" ;    # Root directory
  20. $PATH     = $ENV{'PATH_INFO'} ; 
  21. $wrap     = "/cgi-bin/wrap" ;        # Script alias for this CGI
  22. $ls       = "/sbin/ls -a1" ;
  23.  
  24. #__________________________________________________________
  25. #
  26. #    Read the form data in.  PATH_INFO may be passed here
  27. #    if this was called from a SSI.  We're going to make
  28. #    one final tweak and read from the arg list as well
  29. #    for SSI's.
  30. #__________________________________________________________
  31.  
  32. if( $ENV{'REQUEST_METHOD'} eq "GET" )
  33. {
  34.    $buffer=$ENV{'QUERY_STRING'} ;
  35. else
  36. {
  37.    read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}) ;
  38. }
  39.  
  40. @pairs = split(/&/, $buffer) ;
  41. foreach (@pairs)
  42. {
  43.     tr/+/ / ;    
  44.    ($name,$value) =  split(/=/) ;
  45.     $value        =~ s/%(..)/pack("c",hex($1))/ge ;
  46.     $name         =~ s/%(..)/pack("c",hex($1))/ge ;
  47.  
  48.     $FORM{$name} = $value ;
  49. }
  50.  
  51. #_________________________________
  52. #
  53. #    Some basic checks to take
  54. #    care of
  55. #_________________________________
  56.  
  57. if( $ARGV[0] )
  58. {
  59.     $PATH = $ARGV[0] ;
  60.     $arg  = 1 ;
  61. }
  62. chop $PATH if substr($PATH, -1) eq "/" ;
  63. @_        = split('/', $PATH) ;
  64. $pathRoot = $_[$#_] ;
  65. $doc      = $ROOT.$PATH ;
  66.  
  67. &DefaultMesg if ! defined $PATH || $PATH eq "" ;    # Get a base listing =)
  68. &ErrBadPath unless &ValidPath ;    # Check for server spoofing
  69. &ErrBadPath unless -e $doc ;    # Check to see it exists
  70. &HandleDownload if -f $doc ;    # Do the right thing
  71.  
  72. #__________________________________________________________
  73. #
  74. #    If we get to this point, we can be reasonably certain
  75. #    that this is a valid shared directory.  We want to
  76. #    show it using the appropriate method.  The following
  77. #    section is the leading data.  ShowContents will supply
  78. #    the rest of the data.
  79. #
  80. #    We do, however, need to account for the user putting
  81. #    an index.html file in the directory.  We'll handle 
  82. #    that as follows.  If the file exists, it is assumed to
  83. #    be in the right.  We will append out data at the end,
  84. #    using the index.html's head section. Otherwise, we
  85. #    will use ours.
  86. #__________________________________________________________
  87.  
  88. if( $arg == 1 )
  89. {
  90.     #    This is intentionally left blank
  91. }
  92. elsif( -r "$doc/index.html" )
  93. {
  94.     print "Content-type: text/html\n\n" ;
  95.  
  96.     open(INDEX, "$doc/index.html") ;
  97.     while( <INDEX> )
  98.     {
  99.         next if /<!--#/ ;
  100.         last if /<\/body>/i ;
  101.         last if /<\/html>/i ;
  102.         print ;
  103.     }
  104.     close(INDEX) ;
  105. }
  106. else
  107. {
  108.     print <<ENDOFTEXT ;
  109. Content-type: text/html
  110.  
  111. <head>
  112.     <title>
  113.         Contents of $pathRoot
  114.     </title>
  115. </head>
  116.  
  117. <body bgcolor="42426f" text="ffffff" link="ffff00" vlink="93db70"
  118. alink="cc3232" background=/images/logo.gif>
  119.  
  120. <h1 align=center>
  121.     Contents of $pathRoot
  122. </h1>
  123.  
  124. <hr size=3 width=75% noshade>
  125.  
  126. ENDOFTEXT
  127. }
  128.  
  129. #
  130. # RFE - people getting confused with all these choices.
  131. #
  132. #  &ShowSelection ;
  133. &ShowContents ;
  134.  
  135. print "\n</body>\n</html>\n\n" unless $arg == 1 ;
  136.  
  137.  
  138.  
  139. #__________________________________________________________
  140. #__________________________________________________________
  141. #__________________________________________________________
  142.  
  143.  
  144.  
  145. sub ErrBadPath
  146. {
  147.     print <<ENDOFTEXT ;
  148. Content-type: text/html
  149.  
  150. <HEAD><TITLE>404 Not Found</TITLE></HEAD>
  151. <BODY><H1>404 Not Found</H1>
  152. The requested URL $wrap$ENV{'PATH_INFO'} was not found on this server.<P>
  153. PathInfo = '$PATH'
  154. </BODY>
  155. ENDOFTEXT
  156.  
  157.     die ;
  158. }
  159.  
  160. #__________________________________________________________
  161.  
  162. sub DefaultMesg
  163. {
  164.     open(FILE, "/etc/passwd") ;
  165.     @passwd = <FILE> ;
  166.     close(FILE) ;
  167.  
  168.     unless( $arg == 1 )
  169.     {
  170.         print <<ENDOFTEXT ;
  171. Content-type: text/html
  172.  
  173. <head>
  174.     <title>
  175.         User List
  176.     </title>
  177. </head>
  178.  
  179. <body>
  180. <h1 align=center> 
  181.     User List
  182. </h1>
  183.  
  184. <hr size=3 width=50% noshade>
  185. <p>
  186. <h3 align=center>
  187.     This site supports the following users:
  188. </h3>
  189. <p>
  190. <hr size=3 width=50% noshade>
  191.  
  192. <ul>
  193. ENDOFTEXT
  194.     }
  195.  
  196.     print "<center>\n<table cellpadding=10>\n" ;
  197.  
  198.     open (FIND,"$ls $ROOT |") ;
  199.     while( <FIND> )
  200.     {
  201.         chop ;
  202.         next if $_ eq "\." ;
  203.         next if $_ eq "\.\." ;
  204.         next unless -d "$ROOT/$_" ;
  205.  
  206.         $name = "" ;
  207.  
  208.         foreach $line (@passwd)
  209.         {
  210.             @field = split(':', $line) ;
  211.             @_     = split(',', $field[4]) ;
  212.             ($name = $_[0]), last if $_ eq $field[0] ;
  213.         }
  214.  
  215.         print <<ENDOFTEXT ;
  216. <tr>
  217.     <th align=right>
  218.         <font size=+2>
  219.         <a href="$wrap/$_">$_</a>
  220.         </font>
  221.     </th>
  222.     <td>
  223.         <li>
  224.     </td>
  225.     <td>
  226.         <font size=+2>
  227.         <a href="$wrap/$_">$name</a>
  228.         </font>
  229.     </td>
  230. </tr>
  231. ENDOFTEXT
  232.     }
  233.     close(FIND) ;
  234.  
  235.     print "</table></center>\n</ul>\n</body>\n\n" ;
  236.  
  237.     die ;
  238. }
  239.  
  240. #__________________________________________________________
  241.  
  242. sub ValidPath
  243. {
  244.     return 1 unless /\.\./ ;
  245.     
  246.     return '' if /^\.\./ ;
  247.     return '' if /\/\.\.\// ;
  248.     return '' if /\.\.$/ ;
  249.  
  250.     return 1 ;
  251. }
  252.  
  253. #__________________________________________________________
  254.  
  255. sub HandleDownload
  256. {
  257.     print <<ENDOFTEXT ;
  258. Location: $PATH
  259.  
  260. ENDOFTEXT
  261.  
  262.     die ;
  263. }
  264.  
  265. #__________________________________________________________
  266.  
  267. sub ShowSelection
  268. {
  269.     local(@select) ;
  270.     
  271.     $FORM{'format'} = "default" unless defined $FORM{'format'} ;
  272.     $select{$FORM{'format'}} = "checked" ;
  273.  
  274.     print <<ENDOFTEXT ;
  275.  
  276. <center>
  277. <table cellpadding=2 cellspacing=0 border=0>
  278. <form action="$wrap$PATH" method=get>
  279. <tr>
  280.     <td><b>Viewing format:</b>
  281.         <input    type="radio"
  282.                 name="format"
  283.                 value="default"
  284.                 $select{'default'}> Default
  285.         <input    type="radio"
  286.                 name="format"
  287.                 value="long"
  288.                 $select{'long'}> Long
  289.         <input    type="radio"
  290.                 name="format"
  291.                 value="short"
  292.                 $select{'short'}> Short </th>
  293.     <td align=center>
  294.         <input type="submit" value="Apply"></td>    
  295. </tr>
  296. </form>
  297. </table>
  298. </center>
  299.  
  300. ENDOFTEXT
  301. }
  302.  
  303. #__________________________________________________________
  304.  
  305. sub ShowContents
  306. {
  307.     local($format) = $FORM{'format'} ;
  308.  
  309.     #_________________________________
  310.     #
  311.     #    Get the directory and do
  312.     #    some sorting (directories)
  313.     #    come first, then files.
  314.     #_________________________________
  315.  
  316.     open (FIND,"$ls $ROOT$PATH |") ;
  317.     while( <FIND> )
  318.     {
  319.         chop ;
  320.         next if $_ eq "\." ;
  321.         next if $_ eq "\.\." ;
  322.         push(@d, $_), next if -d "$ROOT$PATH/$_" ;
  323.         push(@f, $_) ;
  324.     }
  325.  
  326.     #_________________________________
  327.     #
  328.     #    Select method of display
  329.     #_________________________________
  330.  
  331.     &ListFolders(@d) ;
  332.     $format = "default" if ! defined $format ;
  333.  
  334.     if( $format eq "long" )
  335.     {
  336.         &ListLong(@f) ;
  337.     }
  338.     elsif( $format eq "short" )
  339.     {
  340.         &ListShort(@f) ;
  341.     }
  342.     else        # default format
  343.     {
  344.         &ListDefault(@f) ;
  345.     }
  346. }
  347.  
  348. #__________________________________________________________
  349.  
  350. sub ListFolders
  351. {
  352.     local($size) = $#_ + 1 ;
  353.     local($i) ;
  354.     local($j) ;
  355.     local($index) ;
  356.     local($format) ;
  357.     local($cols) = 3 ;
  358.     local($rows) = $size / $cols ;
  359.     local($left) = $size % $cols ;
  360.  
  361.     return if $size == 0 ;
  362.  
  363.     #_________________________________
  364.  
  365.     $format = "?format=$FORM{'format'}" if defined $FORM{'format'} ;
  366.  
  367.     #_________________________________
  368.  
  369.     $rows = sprintf("%.0d", $rows) ;
  370.     $rows++ if $left > 0 ;
  371.     
  372.     print <<ENDOFTEXT ;
  373.  
  374. </center>
  375. <h3>Shared Folders:</h3>
  376.  
  377. <table cellpadding=5 cellspacing=3 border width=100%><tr><td>
  378. <table cellpadding=3 width=100%>
  379. ENDOFTEXT
  380.     LOOP:
  381.     for( $i = 0 ; $i < $rows ; $i++ )
  382.     {
  383.         print "<tr>\n" ;
  384.         for( $j = 0 ; $j < $cols ; $j++ )
  385.         {
  386.             $index = $i + $j * $rows ;
  387.             if( $index >= $size )
  388.             {
  389.                 print "<td></td>\n" ;
  390.                 next ;
  391.             }
  392.             print <<ENDOFTEXT ;
  393. <td>
  394.     <a href=$wrap$PATH/$_[$index]$format>
  395.         <img src=/images/directory.gif align=middle border=0>
  396.         $_[$index]
  397.     </a>
  398. </td>
  399. ENDOFTEXT
  400.         }
  401.         print "</tr>\n" ;
  402.     }
  403.  
  404.     print <<ENDOFTEXT ;
  405. </table>
  406. </td></tr></table>
  407. <p>
  408. ENDOFTEXT
  409. }
  410.  
  411. #__________________________________________________________
  412.  
  413. sub ListDefault
  414. {
  415.     local($isdir) ;
  416.     local($icon) ;
  417.     local($type) ;
  418.     local(@notes) ;
  419.     local($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,@other) ;
  420.     local($USERPATH) = $PATH ;
  421.  
  422.     return if ( $#_ == -1 ) ;
  423.  
  424.     substr($USERPATH, 0, 1) = "/~" ;
  425.  
  426.     print <<ENDOFTEXT ;
  427.  
  428. </center>
  429. <h3>Shared Files:</h3>
  430. <table cellpadding=5 cellspacing=3 border width=100%>
  431.  
  432. <tr>
  433.     <th width=50%>Name</th>
  434.     <th width=5%>Size</th>
  435.     <th width=45%>Action</th>
  436. </tr>
  437. ENDOFTEXT
  438.  
  439.     foreach (@_)
  440.     {
  441.         #_________________________________
  442.         #
  443.         #    Calculate the size of this
  444.         #    file
  445.         #_________________________________
  446.  
  447.         ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,@other) =
  448.             stat("$doc/$_") ; 
  449.  
  450.         if( $size == 1 )
  451.         {
  452.             $size = "<b>$size</b> byte" ;
  453.         }
  454.         elsif( $size >= 1024 )
  455.         {
  456.             $size = $size / 1024 ;
  457.             $size = sprintf("%.0d", $size) ;
  458.             $size = "<b>$size</b> KB" ;
  459.         }
  460.         else
  461.         {
  462.             $size = "<b>$size</b> bytes" ;
  463.         }
  464.  
  465.         #_________________________________
  466.         #
  467.         #    Add notes if applicable
  468.         #_________________________________
  469.  
  470.         if( -e "$doc/$_.notes" )
  471.         {
  472.             open(DATA, "$doc/$_.notes") ;
  473.             @notes = <DATA> ;
  474.             close(DATA) ;
  475.             $row = 2 ;
  476.         }
  477.         else
  478.         {
  479.             $row = 1 ;
  480.         }
  481.         
  482.         #_________________________________
  483.         #
  484.         #    Diplay the data in table form
  485.         #_________________________________
  486.  
  487.         print <<ENDOFTEXT ;
  488. <form action="/cgi-bin/handler$PATH/$_" method=post>
  489. <tr>
  490.     <td rowspan=$row>
  491.         <a href="$USERPATH/$_">
  492.             <img src=/images/data.gif align=middle border=0>
  493.             $_
  494.         </a>
  495.         <br>
  496.     </td>
  497.     <td align=center>
  498.         $size
  499.     </td>
  500.     <td align=center>
  501.         <input type="submit" name="data" value="View">
  502.         <input type="submit" name="data" value="Download">
  503.     </td>
  504. </tr>
  505. ENDOFTEXT
  506.  
  507.         #_________________________________
  508.         #
  509.         #    If there is a .notes file,
  510.         #    show the message within the
  511.         #    HTML doc.
  512.         #_________________________________
  513.  
  514.         if( $row == 2 )
  515.         {
  516.             print "<tr> <td colspan=2>\n" ;
  517.             print "<b>Notes: </b>\n" ;
  518.             foreach (@notes)
  519.             {
  520.                 print ;
  521.             }
  522.             print "</td> </tr>\n" ;
  523.         }
  524.         print "</form>\n" ;
  525.     }
  526.     print "</table></center>\n"
  527. }
  528.  
  529. #__________________________________________________________
  530.  
  531. sub ListShort
  532. {
  533.     local($size) = $#_ + 1 ;
  534.     local($i) ;
  535.     local($j) ;
  536.     local($index) ;
  537.     local($cols) = 3 ;
  538.     local($rows) = $size / $cols ;
  539.     local($left) = $size % $cols ;
  540.  
  541.     return if $size == 0 ;
  542.  
  543.     $rows = sprintf("%.0d", $rows) ;
  544.     $rows++ if $left > 0 ;
  545.     
  546.     print <<ENDOFTEXT ;
  547.  
  548. </center>
  549. <h3>Shared Files:</h3>
  550.  
  551. <table cellpadding=5 cellspacing=3 border width=100%><tr><td>
  552. <table cellpadding=3 width=100%>
  553. ENDOFTEXT
  554.     LOOP:
  555.     for( $i = 0 ; $i < $rows ; $i++ )
  556.     {
  557.         print "<tr>\n" ;
  558.         for( $j = 0 ; $j < $cols ; $j++ )
  559.         {
  560.             $index = $i + $j * $rows ;
  561.             if( $index >= $size )
  562.             {
  563.                 print "<td></td>\n" ;
  564.                 next ;
  565.             }
  566.             print <<ENDOFTEXT ;
  567. <td>
  568.     <a href=$PATH/$_[$index]>
  569.         <img src=/images/data.gif align=middle border=0>
  570.         $_[$index]
  571.     </a>
  572. </td>
  573. ENDOFTEXT
  574.         }
  575.         print "</tr>\n" ;
  576.     }
  577.  
  578.     print <<ENDOFTEXT ;
  579. </table>
  580. </td></tr></table>
  581. ENDOFTEXT
  582. }
  583.  
  584. #__________________________________________________________
  585.  
  586. sub ListLong
  587. {
  588.     local($unit) ;
  589.     local(@other) ;
  590.     local($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size) ;
  591.     local($atime, $mtime, $ctime) ;
  592.     local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) ;
  593.     
  594.     return if $#_ == -1 ;
  595.     
  596.     print <<ENDOFTEXT ;
  597.  
  598. <h3>Shared Files:</h3>
  599. <table cellpadding=5 cellspacing=3 border width=100%>
  600. <tr><td>
  601. <pre>
  602.  
  603. ENDOFTEXT
  604.  
  605.     foreach (@_)
  606.     {
  607.         #_________________________________
  608.         #
  609.         #    stat document and get the 
  610.         #    pertinent info on it.  Also
  611.         #    get a unit for the size, ie
  612.         #    bytes or Kb, etc
  613.         #_________________________________
  614.         
  615.         ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
  616.             $atime, $mtime, $ctime, @other) =
  617.             stat("$doc/$_") ; 
  618.  
  619.         if( $size == 1 )
  620.         {
  621.             $unit = "byte" ;
  622.         }
  623.         elsif( $size >= 1024 )
  624.         {
  625.             $size = $size / 1024 ;
  626.             $size = sprintf("%.0d", $size) ;
  627.             $unit = "KB" ;
  628.         }
  629.         else
  630.         {
  631.             $unit = "bytes" ;
  632.         }
  633.  
  634.         #_________________________________
  635.         #
  636.         #    Get last mod time
  637.         #_________________________________
  638.  
  639.         ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,@other) = 
  640.             localtime($ctime) ;
  641.         $theDay   = (Sun,Mon,Tue,Wed,Thu,Fri,Sat)[$wday] ;
  642.         $theMonth = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec)[$mon] ;
  643.         $date     = sprintf("$theDay $theMonth $mday %02d:%02d:%02d 19$year",
  644.                             $hour, $min, $sec) ;
  645.  
  646.         #_________________________________
  647.  
  648.         local($filler) = " " x (25 - length($_)) ;
  649.         $filler = 0 if $filler < 0 ;
  650.         print sprintf("<a href=$PATH/$_><img src=/images/data.gif align=middle border=0>%.25s</a>%s %6d %-5.5s %s\n", $_, $filler, $size, $unit, $date) ;
  651.     }
  652.  
  653.     print <<ENDOFTEXT ;
  654. </pre>
  655. </td></tr>
  656. </table>
  657. ENDOFTEXT
  658. }
  659.  
  660.